/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

/**
 *
 * @author Thiago
 */
public class SuavizarHeightmap {
    Heightmap h;
    
    public SuavizarHeightmap(Heightmap h){
        this.h = h;
    }
    
    public void suavizar(){
        int [][] matriz = h.getMapaMatriz();
        
        int [][] matrizAux = new int[matriz.length+2][matriz[0].length+2];
        
        for (int i = 1; i <= matriz.length; i++) {
            for (int j = 1; j <= matriz.length; j++) {
                matrizAux[i][j] = matriz[i-1][j-1];
            }
        }
        
        int media;
        
        for (int j = 1; j < matrizAux.length-1; j++) {
            for (int i = 1; i < matrizAux.length-1; i++) {

                media = (getColor(matrizAux[i - 1][j - 1])
                        + getColor(matrizAux[i - 1][j])
                        + getColor(matrizAux[i - 1][+j])
                        + getColor(matrizAux[i][j])
                        + getColor(matrizAux[i][j - 1])
                        + getColor(matrizAux[i][j + 1])
                        + getColor(matrizAux[i + 1][j - 1])
                        + getColor(matrizAux[i + 1][j])
                        + getColor(matrizAux[i + 1][j + 1]))/9;
                
                matrizAux[i][j] = setRGB(media, media, media);
                
            }
        }
        
        for (int i = 1; i <= matriz.length; i++) {
            for (int j = 1; j <= matriz.length; j++) {
                matriz[i-1][j-1] = matrizAux[i][j];
            }
        }
    }
    
    private int getColor(int c) {
        return (c & 0xFF);
    }
    
    private int setRGB(int r, int g, int b) {
        return ((255 & 0xFF) << 24)
                | ((r & 0xFF) << 16)
                | ((g & 0xFF) << 8)
                | ((b & 0xFF) << 0);
    }
}
